import { UserRole, Permission, RolePermission } from '../types';

// 权限常量定义
export const PERMISSIONS = {
  // 用户管理
  USER_VIEW: 'user:view',
  USER_CREATE: 'user:create',
  USER_UPDATE: 'user:update',
  USER_DELETE: 'user:delete',
  
  // 店铺管理
  SHOP_VIEW: 'shop:view',
  SHOP_CREATE: 'shop:create',
  SHOP_UPDATE: 'shop:update',
  SHOP_DELETE: 'shop:delete',
  SHOP_APPROVE: 'shop:approve',
  SHOP_VIEW_ALL: 'shop:view_all', // 查看所有店铺
  SHOP_VIEW_OWN: 'shop:view_own', // 只能查看自己的店铺
  
  // 商品管理
  PRODUCT_VIEW: 'product:view',
  PRODUCT_CREATE: 'product:create',
  PRODUCT_UPDATE: 'product:update',
  PRODUCT_DELETE: 'product:delete',
  PRODUCT_VIEW_ALL: 'product:view_all', // 查看所有商品
  PRODUCT_VIEW_OWN: 'product:view_own', // 只能查看自己店铺的商品
  
  // 订单管理
  ORDER_VIEW: 'order:view',
  ORDER_UPDATE: 'order:update',
  ORDER_VIEW_ALL: 'order:view_all', // 查看所有订单
  ORDER_VIEW_OWN: 'order:view_own', // 只能查看自己店铺的订单
  
  // 优惠券管理
  COUPON_VIEW: 'coupon:view',
  COUPON_CREATE: 'coupon:create',
  COUPON_UPDATE: 'coupon:update',
  COUPON_DELETE: 'coupon:delete',
  COUPON_CREATE_PLATFORM: 'coupon:create_platform', // 创建平台优惠券
  COUPON_CREATE_SHOP: 'coupon:create_shop', // 创建店铺优惠券
  
  // 轮播图管理
  BANNER_VIEW: 'banner:view',
  BANNER_CREATE: 'banner:create',
  BANNER_UPDATE: 'banner:update',
  BANNER_DELETE: 'banner:delete',
  
  // 销售数据
  SALES_VIEW: 'sales:view',
  SALES_VIEW_ALL: 'sales:view_all', // 查看全平台销售数据
  SALES_VIEW_OWN: 'sales:view_own', // 只能查看自己店铺的销售数据
  
  // 客服管理
  CHAT_VIEW: 'chat:view',
  CHAT_REPLY: 'chat:reply',
  CHAT_MANAGE: 'chat:manage',
  
  // 系统管理
  SYSTEM_CONFIG: 'system:config',
  SYSTEM_LOG: 'system:log',
} as const;

// 权限详细信息
export const PERMISSION_DETAILS: Permission[] = [
  // 用户管理权限
  { id: '1', name: '查看用户', code: PERMISSIONS.USER_VIEW, description: '查看用户列表和详情', module: 'user' },
  { id: '2', name: '创建用户', code: PERMISSIONS.USER_CREATE, description: '创建新用户', module: 'user' },
  { id: '3', name: '更新用户', code: PERMISSIONS.USER_UPDATE, description: '更新用户信息', module: 'user' },
  { id: '4', name: '删除用户', code: PERMISSIONS.USER_DELETE, description: '删除用户', module: 'user' },
  
  // 店铺管理权限
  { id: '5', name: '查看店铺', code: PERMISSIONS.SHOP_VIEW, description: '查看店铺信息', module: 'shop' },
  { id: '6', name: '创建店铺', code: PERMISSIONS.SHOP_CREATE, description: '创建新店铺', module: 'shop' },
  { id: '7', name: '更新店铺', code: PERMISSIONS.SHOP_UPDATE, description: '更新店铺信息', module: 'shop' },
  { id: '8', name: '删除店铺', code: PERMISSIONS.SHOP_DELETE, description: '删除店铺', module: 'shop' },
  { id: '9', name: '审核店铺', code: PERMISSIONS.SHOP_APPROVE, description: '审核店铺申请', module: 'shop' },
  { id: '10', name: '查看所有店铺', code: PERMISSIONS.SHOP_VIEW_ALL, description: '查看平台所有店铺', module: 'shop' },
  { id: '11', name: '查看自己店铺', code: PERMISSIONS.SHOP_VIEW_OWN, description: '只能查看自己的店铺', module: 'shop' },
  
  // 商品管理权限
  { id: '12', name: '查看商品', code: PERMISSIONS.PRODUCT_VIEW, description: '查看商品信息', module: 'product' },
  { id: '13', name: '创建商品', code: PERMISSIONS.PRODUCT_CREATE, description: '创建新商品', module: 'product' },
  { id: '14', name: '更新商品', code: PERMISSIONS.PRODUCT_UPDATE, description: '更新商品信息', module: 'product' },
  { id: '15', name: '删除商品', code: PERMISSIONS.PRODUCT_DELETE, description: '删除商品', module: 'product' },
  { id: '16', name: '查看所有商品', code: PERMISSIONS.PRODUCT_VIEW_ALL, description: '查看平台所有商品', module: 'product' },
  { id: '17', name: '查看自己商品', code: PERMISSIONS.PRODUCT_VIEW_OWN, description: '只能查看自己店铺的商品', module: 'product' },
  
  // 订单管理权限
  { id: '18', name: '查看订单', code: PERMISSIONS.ORDER_VIEW, description: '查看订单信息', module: 'order' },
  { id: '19', name: '更新订单', code: PERMISSIONS.ORDER_UPDATE, description: '更新订单状态', module: 'order' },
  { id: '20', name: '查看所有订单', code: PERMISSIONS.ORDER_VIEW_ALL, description: '查看平台所有订单', module: 'order' },
  { id: '21', name: '查看自己订单', code: PERMISSIONS.ORDER_VIEW_OWN, description: '只能查看自己店铺的订单', module: 'order' },
  
  // 优惠券管理权限
  { id: '22', name: '查看优惠券', code: PERMISSIONS.COUPON_VIEW, description: '查看优惠券信息', module: 'coupon' },
  { id: '23', name: '创建优惠券', code: PERMISSIONS.COUPON_CREATE, description: '创建优惠券', module: 'coupon' },
  { id: '24', name: '更新优惠券', code: PERMISSIONS.COUPON_UPDATE, description: '更新优惠券信息', module: 'coupon' },
  { id: '25', name: '删除优惠券', code: PERMISSIONS.COUPON_DELETE, description: '删除优惠券', module: 'coupon' },
  { id: '26', name: '创建平台优惠券', code: PERMISSIONS.COUPON_CREATE_PLATFORM, description: '创建全平台优惠券', module: 'coupon' },
  { id: '27', name: '创建店铺优惠券', code: PERMISSIONS.COUPON_CREATE_SHOP, description: '创建店铺优惠券', module: 'coupon' },
  
  // 轮播图管理权限
  { id: '28', name: '查看轮播图', code: PERMISSIONS.BANNER_VIEW, description: '查看轮播图', module: 'banner' },
  { id: '29', name: '创建轮播图', code: PERMISSIONS.BANNER_CREATE, description: '创建轮播图', module: 'banner' },
  { id: '30', name: '更新轮播图', code: PERMISSIONS.BANNER_UPDATE, description: '更新轮播图', module: 'banner' },
  { id: '31', name: '删除轮播图', code: PERMISSIONS.BANNER_DELETE, description: '删除轮播图', module: 'banner' },
  
  // 销售数据权限
  { id: '32', name: '查看销售数据', code: PERMISSIONS.SALES_VIEW, description: '查看销售统计', module: 'sales' },
  { id: '33', name: '查看全平台数据', code: PERMISSIONS.SALES_VIEW_ALL, description: '查看全平台销售数据', module: 'sales' },
  { id: '34', name: '查看自己数据', code: PERMISSIONS.SALES_VIEW_OWN, description: '只能查看自己店铺的销售数据', module: 'sales' },
  
  // 客服管理权限
  { id: '35', name: '查看客服', code: PERMISSIONS.CHAT_VIEW, description: '查看客服会话', module: 'chat' },
  { id: '36', name: '客服回复', code: PERMISSIONS.CHAT_REPLY, description: '回复客服消息', module: 'chat' },
  { id: '37', name: '客服管理', code: PERMISSIONS.CHAT_MANAGE, description: '管理客服系统', module: 'chat' },
  
  // 系统管理权限
  { id: '38', name: '系统配置', code: PERMISSIONS.SYSTEM_CONFIG, description: '系统配置管理', module: 'system' },
  { id: '39', name: '系统日志', code: PERMISSIONS.SYSTEM_LOG, description: '查看系统日志', module: 'system' },
];

// 角色权限配置
export const ROLE_PERMISSIONS: RolePermission[] = [
  {
    role: 'admin',
    permissions: [
      // 用户管理 - 全部权限
      PERMISSIONS.USER_VIEW,
      PERMISSIONS.USER_CREATE,
      PERMISSIONS.USER_UPDATE,
      PERMISSIONS.USER_DELETE,
      
      // 店铺管理 - 全部权限
      PERMISSIONS.SHOP_VIEW,
      PERMISSIONS.SHOP_CREATE,
      PERMISSIONS.SHOP_UPDATE,
      PERMISSIONS.SHOP_DELETE,
      PERMISSIONS.SHOP_APPROVE,
      PERMISSIONS.SHOP_VIEW_ALL,
      
      // 商品管理 - 全部权限
      PERMISSIONS.PRODUCT_VIEW,
      PERMISSIONS.PRODUCT_CREATE,
      PERMISSIONS.PRODUCT_UPDATE,
      PERMISSIONS.PRODUCT_DELETE,
      PERMISSIONS.PRODUCT_VIEW_ALL,
      
      // 订单管理 - 全部权限
      PERMISSIONS.ORDER_VIEW,
      PERMISSIONS.ORDER_UPDATE,
      PERMISSIONS.ORDER_VIEW_ALL,
      
      // 优惠券管理 - 全部权限
      PERMISSIONS.COUPON_VIEW,
      PERMISSIONS.COUPON_CREATE,
      PERMISSIONS.COUPON_UPDATE,
      PERMISSIONS.COUPON_DELETE,
      PERMISSIONS.COUPON_CREATE_PLATFORM,
      PERMISSIONS.COUPON_CREATE_SHOP,
      
      // 轮播图管理 - 全部权限
      PERMISSIONS.BANNER_VIEW,
      PERMISSIONS.BANNER_CREATE,
      PERMISSIONS.BANNER_UPDATE,
      PERMISSIONS.BANNER_DELETE,
      
      // 销售数据 - 全部权限
      PERMISSIONS.SALES_VIEW,
      PERMISSIONS.SALES_VIEW_ALL,
      
      // 客服管理 - 全部权限
      PERMISSIONS.CHAT_VIEW,
      PERMISSIONS.CHAT_REPLY,
      PERMISSIONS.CHAT_MANAGE,
      
      // 系统管理 - 全部权限
      PERMISSIONS.SYSTEM_CONFIG,
      PERMISSIONS.SYSTEM_LOG,
    ],
  },
  {
    role: 'seller',
    permissions: [
      // 店铺管理 - 只能管理自己的店铺
      PERMISSIONS.SHOP_VIEW,
      PERMISSIONS.SHOP_UPDATE,
      PERMISSIONS.SHOP_VIEW_OWN,
      
      // 商品管理 - 只能管理自己店铺的商品
      PERMISSIONS.PRODUCT_VIEW,
      PERMISSIONS.PRODUCT_CREATE,
      PERMISSIONS.PRODUCT_UPDATE,
      PERMISSIONS.PRODUCT_DELETE,
      PERMISSIONS.PRODUCT_VIEW_OWN,
      
      // 订单管理 - 只能查看自己店铺的订单
      PERMISSIONS.ORDER_VIEW,
      PERMISSIONS.ORDER_UPDATE,
      PERMISSIONS.ORDER_VIEW_OWN,
      
      // 优惠券管理 - 只能创建店铺优惠券
      PERMISSIONS.COUPON_VIEW,
      PERMISSIONS.COUPON_CREATE,
      PERMISSIONS.COUPON_UPDATE,
      PERMISSIONS.COUPON_DELETE,
      PERMISSIONS.COUPON_CREATE_SHOP,
      
      // 销售数据 - 只能查看自己店铺的数据
      PERMISSIONS.SALES_VIEW,
      PERMISSIONS.SALES_VIEW_OWN,
      
      // 客服管理 - 基本客服功能
      PERMISSIONS.CHAT_VIEW,
      PERMISSIONS.CHAT_REPLY,
    ],
  },
  {
    role: 'customer_service',
    permissions: [
      // 客服管理 - 客服相关权限
      PERMISSIONS.CHAT_VIEW,
      PERMISSIONS.CHAT_REPLY,
      
      // 订单管理 - 查看权限（用于客服处理订单问题）
      PERMISSIONS.ORDER_VIEW,
      PERMISSIONS.ORDER_VIEW_OWN,
      
      // 商品管理 - 查看权限（用于客服回答商品问题）
      PERMISSIONS.PRODUCT_VIEW,
      PERMISSIONS.PRODUCT_VIEW_OWN,
    ],
  },
];

// 权限检查工具函数
export class PermissionManager {
  private userPermissions: string[] = [];
  
  constructor(permissions: string[] = []) {
    this.userPermissions = permissions;
  }
  
  // 检查是否有指定权限
  hasPermission(permission: string): boolean {
    return this.userPermissions.includes(permission);
  }
  
  // 检查是否有任意一个权限
  hasAnyPermission(permissions: string[]): boolean {
    return permissions.some(permission => this.hasPermission(permission));
  }
  
  // 检查是否有所有权限
  hasAllPermissions(permissions: string[]): boolean {
    return permissions.every(permission => this.hasPermission(permission));
  }
  
  // 根据角色获取权限列表
  static getPermissionsByRole(role: UserRole): string[] {
    const rolePermission = ROLE_PERMISSIONS.find(rp => rp.role === role);
    return rolePermission ? rolePermission.permissions : [];
  }
  
  // 检查用户是否可以访问指定店铺的资源
  canAccessShop(userRole: UserRole, userShopId: string | undefined, targetShopId: string): boolean {
    // 超级管理员可以访问所有店铺
    if (userRole === 'admin') {
      return true;
    }
    
    // 商家和客服只能访问自己店铺的资源
    if (userRole === 'seller' || userRole === 'customer_service') {
      return userShopId === targetShopId;
    }
    
    return false;
  }
  
  // 过滤菜单项（根据权限）
  filterMenuItems(menuItems: any[], userPermissions: string[]): any[] {
    const permissionManager = new PermissionManager(userPermissions);
    
    return menuItems.filter(item => {
      // 如果没有权限要求，则显示
      if (!item.permission) {
        return true;
      }
      
      // 检查权限
      if (Array.isArray(item.permission)) {
        return permissionManager.hasAnyPermission(item.permission);
      } else {
        return permissionManager.hasPermission(item.permission);
      }
    }).map(item => ({
      ...item,
      children: item.children ? this.filterMenuItems(item.children, userPermissions) : undefined,
    }));
  }
}

export default PermissionManager;
